home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 001-100 / 001-025 / 024 / csh / comm2.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  3KB  |  180 lines

  1.  
  2. /*
  3.  * COMM2.C
  4.  *
  5.  * Matthew Dillon  28 Apr 1986
  6.  * MORE commands
  7.  */
  8.  
  9. #include "shell.h"
  10.  
  11. do_return()
  12. {
  13.    if (Src_stack) {
  14.       fseek (Src_base[Src_stack - 1], 0, 2);
  15.       Rval = (ac < 2) ? 1 : atoi(av[1]);
  16.       return (-1);
  17.    } else {
  18.       exit ((ac < 2) ? 1 : atoi(av[1]));
  19.    }
  20. }
  21.  
  22.  
  23. /*
  24.  * if A < B   <, >, =, <=, >=, !=, where A and B are either:
  25.  * nothing
  26.  * a string
  27.  * a value (begins w/ number)
  28.  */
  29.  
  30. do_if(garbage, com)
  31. char *garbage;
  32. {
  33.    char *v1, *v2, *v3, result, num;
  34.    int n1, n2;
  35.  
  36.    switch (com) {
  37.    case 0:
  38.       if (If_stack && If_base[If_stack - 1]) {
  39.          If_base[If_stack++] = 1;
  40.          break;
  41.       }
  42.       result = num = 0;
  43.       if (ac <= 2) {       /* if $var; */
  44.          if (ac == 1 || strlen(av[1]) == 0 || (strlen(av[1]) == 1 && *av[1] == ' '))
  45.             goto do_result;
  46.          result = 1;
  47.          goto do_result;
  48.       }
  49.       if (ac != 4) {
  50.          ierror(NULL, 500);
  51.          break;
  52.       }
  53.       v1 = av[1]; v2 = av[2]; v3 = av[3];
  54.       while (*v1 == ' ')
  55.          ++v1;
  56.       while (*v2 == ' ')
  57.          ++v2;
  58.       while (*v3 == ' ')
  59.          ++v3;
  60.       if (*v1 >= '0' && *v1 <= '9') {
  61.          num = 1;
  62.          n1 = atoi(v1);
  63.          n2 = atoi(v3);
  64.       }
  65.       while (*v2) {
  66.          switch (*v2++) {
  67.          case '>':
  68.             result |= (num) ? (n1 >  n2) : (strcmp(v1, v3) > 0);
  69.             break;
  70.          case '<':
  71.             result |= (num) ? (n1 <  n2) : (strcmp(v1, v3) < 0);
  72.             break;
  73.          case '=':
  74.             result |= (num) ? (n1 == n2) : (strcmp(v1, v3) ==0);
  75.             break;
  76.          default:
  77.             ierror (NULL, 503);
  78.             break;
  79.          }
  80.       }
  81. do_result:
  82.       If_base[If_stack++] = !result;
  83.       break;
  84.    case 1:
  85.       if (If_stack > 1 && If_base[If_stack - 2])
  86.          break;
  87.       if (If_stack)
  88.          If_base[If_stack - 1] ^= 1;
  89.       break;
  90.    case 2:
  91.       if (If_stack)
  92.          --If_stack;
  93.       break;
  94.    }
  95.    Disable = (If_stack) ? If_base[If_stack - 1] : 0;
  96.    return (1);
  97. }
  98.  
  99. do_label()
  100. {
  101.    char aseek[32];
  102.  
  103.    if (Src_stack == 0) {
  104.       ierror (NULL, 502);
  105.       return (-1);
  106.    }
  107.    sprintf (aseek, "%d %d", Src_pos[Src_stack-1], If_stack);
  108.    set_var (LEVEL_LABEL + Src_stack - 1, av[1], aseek);
  109.    return (1);
  110. }
  111.  
  112. do_goto()
  113. {
  114.    int new;
  115.    long pos;
  116.    char *lab;
  117.  
  118.    if (Src_stack == 0) {
  119.       ierror (NULL, 502);
  120.    } else {
  121.       lab = get_var (LEVEL_LABEL + Src_stack - 1, av[1]);
  122.       if (lab == NULL) {
  123.          ierror (NULL, 501);
  124.       } else {
  125.          pos = atoi(lab);
  126.          fseek (Src_base[Src_stack - 1], pos, 0);
  127.          Src_pos[Src_stack - 1] = pos;
  128.          new = atoi(next_word(lab));
  129.          for (; If_stack < new; ++If_stack)
  130.             If_base[If_stack] = 0;
  131.          If_stack = new;
  132.       }
  133.    }
  134.    return (-1);      /* Don't execute reset of this line */
  135. }
  136.  
  137.  
  138. do_failat()
  139. {
  140.    Faillevel = 1;
  141.    puts ("NOT IMPLIMENTED YET");
  142. }
  143.  
  144. do_checkbrk()
  145. {
  146.    puts ("NOT IMPLIMENTED YET");
  147. }
  148.  
  149. do_inc(garbage, com)
  150. char *garbage;
  151. {
  152.    char *var;
  153.    char num[32];
  154.  
  155.    if (ac == 3)
  156.       com = atoi(av[2]);
  157.    var = get_var (LEVEL_SET, av[1]);
  158.    if (var) {
  159.       sprintf (num, "%d", atoi(var)+com);
  160.       set_var (LEVEL_SET, av[1], num);
  161.    }
  162. }
  163.  
  164. do_input()
  165. {
  166.    char in[256];
  167.  
  168.    gets(in);
  169.    set_var (LEVEL_SET, av[1], in);
  170.    return (1);
  171. }
  172.  
  173. do_ver()
  174. {
  175.    puts (VERSION);
  176.    return (1);
  177. }
  178.  
  179.  
  180.